//  发送axios的

import axios from 'axios'
import store from '@/store';
import router  from '@/router/index'
import { getTokenTimeStamp } from './auth';


//  设置过期时间
const ExpirationTime=60*60
// 检测token有没有过期
// 定义过期函数
function isCheckTimeOut(){
  //  获取现在时间
 const curTime=Date.now()
//  ( 现在的时间-存储token的时间)/1000>ExpirationTime
// 返回的结果是true  说明token已经过期了  否则没有过期
return (curTime-getTokenTimeStamp())/1000>ExpirationTime

}

// 创建了一个新的axios实例
const service = axios.create({
    // baseURL:'http://ihrm.itheima.net/'   //这里是服务器的目标地址 会和浏览器冲突   不同源   所以需要使用代理服务器 如下
    // baseURL:'/api/'      //它会自动拼接当前自己本地服务器的地址  http://localhost:9528/api/sys/login
    baseURL:process.env.VUE_APP_BASE_API,
    timeout:5000  //设置网络请求的超过时间    当前设置的是5秒  如果请求时间超过会报错


})
// 导出一个axios的实例 而且这个实例要有请求拦截器  响应拦截器
// service.interceptors.request.use() // 请求拦截器
// service.interceptors.response.use() // 响应拦截器


// 添加请求拦截器
service.interceptors.request.use(function (config) {
 console.log('所有正常请求在到达服务器之前都会经过这里',config);
//  判断是登录  如果已经登录直接 直接获取token
const token=store.state.user.token
if(token) {
  // 首先要确定有token  然后在检查token有没有过期
  if(isCheckTimeOut()){
    // isCheckTimeOut()返回的结果是true token失效
    // 清空tonken  清空 用户信息
    store.commit('user/delToken')
    store.commit('user/delUserInfo')
    // 跳转到登录页面
    router.push('/login')
    // 手动返回一个错误提示
    return Promise.reject(new Error('Token过期了,请重新登录'))

  }
// 在请求headers中统一携带token
config.headers.Authorization=`Bearer ${token}`
}
// config是请求对象,此对象转发给服务器
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });


// 添加响应拦截器
service.interceptors.response.use(function (response) {
    console.log('所有正常响应在返回给浏览器之前会经过这里',response); //response.data.success
    // 判断业务是否错误
    if(!response.data.success) {
        // 如果业务错误(比如账号和密码错误啥的) 手动抛出错误
        return  Promise.reject(new Error(response.data.message))
    }
    // 解包裹 data
    return response.data
  }, function (error) {
    console.log('所有的错误响应在返回浏览器之前都会经过这里',error.response);
  //  判断是否是401的错误  如果是  就说明token失效了  退出登录  重新登录
  if(error.response.status===401&&error.response.data.code===10002){
    // 清空用户信息 清空token
    store.commit('user/delToken')
    store.commit('user/delUserInfo')
    // 跳转到登录页
     router.push('/login')
  }
  
    return Promise.reject(error);
  });

export default service

